home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 05 Programming / TOWERS.SRC < prev    next >
Text File  |  2019-04-13  |  4KB  |  175 lines

  1. /* hanoi -- graphic solution to the                                         */
  2. /*          towers of hanoi puzzle                                          */
  3. /* copyright 1982-4  Michael M Rubenstein                                   */
  4. /* C-64 (Super-C) version by Don Messerli                                   */
  5. /*   must be linked with stdio2.l                                           */
  6. #include "stdio.c"
  7. /* graphics characters                                                      */
  8. #define PINCHR          '|'
  9. #define BASECHR         '-'
  10. #define DISKCHR         '*'
  11. /* lines on screen                                                          */
  12. #define BASELIN 17
  13. #define CNTLIN  21
  14. #define ASKLIN  22
  15. /* screen width                                                             */
  16. #define WIDTH           39
  17. #define MAXDISK         12
  18. int                     pins[MAXDISK][3];
  19. int                     pinpos[3];
  20. int                     ndisks, count;
  21. /* clear screen -- change for your computer                                 */
  22. clear()
  23.  
  24.  putchar(CLR);
  25. |
  26. main()
  27.  
  28.  int i;
  29.   i = WIDTH/3;
  30.  pinpos[0] = WIDTH/6;
  31.  pinpos[1] = pinpos[0] + i;
  32.  pinpos[2] = pinpos[1] + i;
  33.   title();
  34.  while (ndisks = ask())
  35.  
  36.    setup();
  37.    hanoi(ndisks, 0, 1, 2);
  38.  |
  39. |
  40. /* solve the puzzle -- move n disks            */
  41. hanoi(n, from, to, using)
  42.  int n, from, to, using;
  43.  
  44.  if (n)
  45.  
  46.    hanoi(n-1, from, using, to);
  47.    movedsk(from, to);
  48.    putcnt(++count);
  49.    hanoi(n-1, using, to, from);
  50.  |
  51. |
  52. /* setup for solution                          */
  53. setup()
  54.  
  55.  int i, j;
  56.   title();
  57.  cursor(BASELIN, 0);
  58.  for (i = 0; ++i <= WIDTH;)
  59.    putchar(BASECHR);
  60.  for (i = ndisks; i; --i)
  61.    for (j = 0; j < 3; ++j)
  62.    
  63.      cursor(BASELIN - i, pinpos[j]);
  64.      putchar(PINCHR);
  65.    |
  66.  for (i = 0; i < ndisks; ++i)
  67.  
  68.    draw(ndisks-i, BASELIN-1-i, pinpos[0]);
  69.    pins[i][0] = ndisks - i;
  70.    pins[i][1] = pins[i][2] = 0;
  71.  |
  72.  putcnt(count = 0);
  73. |
  74. /* draw a disk of size n at x,y                */
  75. draw(n, x, y)
  76.  int n, x, y;
  77.  
  78.  draw1(DISKCHR, n, x, y);
  79. |
  80. /* undraw a disk of size n at x,y              */
  81. undraw(n, x, y)
  82.  int n, x, y;
  83.  
  84.  draw1(' ', n, x, y);
  85. |
  86. /* aux function for draw & undraw              */
  87. draw1(c, n, x, y)
  88.  int c, n, x, y;
  89.  
  90.  int i;
  91.   cursor(x, y - n);
  92.  for (i = n; i--;)
  93.    putchar(c);
  94.  cursor(x, y + 1);
  95.  for (i = n; i--;)
  96.    putchar(c);
  97. |
  98. /* move a disk                                 */
  99. movedsk(from, to)
  100.  int from, to;
  101.  
  102.  int f, t, n, i, j;
  103.   for (f = ndisks; !pins[--f][from];)       /* find top disk on from */
  104.    ;
  105.  for (t = 0; pins[t][to]; ++t)             /* find first free on to */
  106.    ;
  107.  n = pins[f][from];                        /* size of disk */
  108.   /* move it up above pins */
  109.  for (i = BASELIN - f; --i >= BASELIN - ndisks;)
  110.  
  111.    draw(n, i - 1, pinpos[from]);
  112.    undraw(n, i, pinpos[from]);
  113.  |
  114.   /* move it to new pin */
  115.  if (from < to)
  116.    for (i = pinpos[from]; i < pinpos[to]; ++i)
  117.    
  118.      cursor(BASELIN - ndisks - 1, i - n);
  119.      putchar(' ');
  120.      for (j = n; j--;)
  121.        putchar(DISKCHR);
  122.      putchar(' ');
  123.      for (j = n; j--;)
  124.        putchar(DISKCHR);
  125.    |
  126.  else
  127.    for (i = pinpos[from]; i > pinpos[to]; --i)
  128.    
  129.      cursor(BASELIN - ndisks - 1, i - n - 1);
  130.      for (j = n; j--;)
  131.        putchar(DISKCHR);
  132.      putchar(' ');
  133.      for (j = n; j--;)
  134.        putchar(DISKCHR);
  135.      putchar(' ');
  136.    |
  137.   /* move it down */
  138.  for (i = BASELIN-1-ndisks; i < BASELIN-1-t; ++i)
  139.  
  140.    draw(n, i+1, pinpos[to]);
  141.    undraw(n, i, pinpos[to]);
  142.  |
  143.   /* record new setup */
  144.  pins[t][to] = pins[f][from];
  145.  pins[f][from] = 0;
  146.  
  147. |
  148. /* put the count to the screen                                              */
  149. putcnt(n)
  150.  int n;
  151.  
  152.  cursor(CNTLIN, 0);
  153.  printf("Moves: %4d", n);
  154. |
  155. /* display title                                                            */
  156. title()
  157.  
  158.  clear();
  159.  printf("Towers of Hanoi Puzzle\n");
  160.  printf("Copyright 1982  Michael M Rubenstein\n");
  161.  printf("C-64 (Super-C) version by Don Messerli");
  162. |
  163. /* ask how many disks                                                       */
  164. ask()
  165.  
  166.  int n;
  167.    cursor(ASKLIN, 0);
  168.    printf("How many disks (1-6)?     \b\b\b\b");
  169.    if (scanf("%d",&n) == NULL)
  170.      return 0;
  171.    if (n >= 0 && n <= 6)
  172.      return n;
  173. |
  174.  
  175.